package AbstractFactoryType.src;
/**
 * @Description
 *      工厂模式中，接口中的方法通过具体实现类进行实现
 *      而实现类的获取则通过工厂进行创建，将子类对象的创建延迟到工厂中进行实例化
 *      此时如果拓展接口方法，则需要对所有实现类进行重构，工作量很大
 *
 *      那如果拓展方法，则可以划入到另一个工厂，工厂和工厂之间的关系则可以通过抽象类来进行关联
 *      此种模式增加一个工厂相对比较简单，但要拓展产品则需要改动源码
 *
 * @Date 9:09 2022/8/2
 * @Author sunye
 **/
public class AbstractFactory {
    public static void main(String[] args) {
        AbsFactory huaFactory = new HuaFactory();
        huaFactory.getComputer().work();
        huaFactory.getPhone().play();
        AbsFactory miFactory = new MiFactory();
        miFactory.getComputer().work();
        miFactory.getPhone().play();
    }
}

//原先的接口中只有draw方法，此时需要拓展speak方法
interface Computer {
    void work();
}
interface Phone {
    void play();
}
//小明和小华都能画画和看电视
class MiComputer implements Computer{
    @Override
    public void work() {
        System.out.println("小米电脑在工作");
    }
}
class HuaComputer implements Computer{
    @Override
    public void work() {
        System.out.println("华为电脑在工作");
    }
}

class MiPhone implements Phone{
    @Override
    public void play() {
        System.out.println("小米手机在玩");
    }
}

class HuaPhone implements Phone{
    @Override
    public void play() {
        System.out.println("华为手机在玩");
    }
}


//通过抽象列进行拓展方法，将客户端所需要的先进行声明出来，可以画图也可以看动画
abstract class AbsFactory  {
    abstract Phone getPhone();
    abstract Computer getComputer();
}

class HuaFactory extends AbsFactory{
    @Override
    Phone getPhone() {
        return new HuaPhone();
    }

    @Override
    Computer getComputer() {
        return new HuaComputer();
    }
}

class MiFactory extends AbsFactory{
    @Override
    Phone getPhone() {
        return new MiPhone();
    }

    @Override
    Computer getComputer() {
        return new MiComputer();
    }
}



